#ifndef __MY_HOT__
#define __MT_HOT__
#include <unistd.h>
#include "data.hpp"

extern cloud::DataManager *_data;

namespace cloud
{
    class HotManager
    {
    private:
        std::string _back_dir;    // 备份文件路径
        std::string _pack_dir;    // 压缩文件路径
        std::string _pack_suffix; // 压缩包后缀名
        int _hot_time;            // 热点判断时间
    public:
        HotManager()
        {
            Config *config = Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();

            FileUtil fu1(_back_dir); // 创建备份目录
            fu1.CreateDirectory();
            FileUtil fu2(_pack_dir); // 创建压缩包目录
            fu2.CreateDirectory();
        }
        bool NHotJude(const std::string &filenaem)
        {
            FileUtil fu(filenaem);
            time_t acc_time = fu.LassATime();
            time_t cur_time = time(nullptr);
            if (cur_time - acc_time > _hot_time)
            {
                return true;
            }
            return false;
        }
        bool RunModule()
        {
            while (1)
            {
                // 1.获取备份目录下所有文件
                FileUtil fu(_back_dir);
                std::vector<std::string> arry;
                fu.ScanDirectory(&arry);
                // 2.逐个判断文件是否是非热点文件
                for (auto &a : arry)
                {
                    // 3.判断是否是非热点文件
                    if (NHotJude(a) == false)
                    {
                        continue; // 热点文件
                    }
                    else
                    {
                        //4.获取文件信息
                        BackupInfo info;
                        if(_data->GetOneByRealpath(a,&info) == false)
                        {
                            info.NewBackupInfo(a);
                        }
                        // 4.非热点文件压缩处理 问题1：怎么把压缩包文件移到压缩包目录下？找到目录，将文件创建在这个目录下
                        FileUtil tmp(a);
                        tmp.Compress(info.pack_path);
                        
                        // 5.删除源文件，修改备份信息
                        tmp.Remove();
                        info.pack_flag = true;
                        _data->Updata(info);
                    }
                }
                usleep(1000); //避免空目录消耗CPU资源过高
            }
        }
    };

} // namespace cloud

#endif